package com.axon.components.controls
{
	import com.axon.base.helpers.AxUtils;
	import com.axon.components.events.AxListEvent;
	
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;
	
	import mx.collections.ArrayCollection;
	import mx.collections.XMLListCollection;
	import mx.controls.TileList;
	import mx.events.ListEvent;

	[Event(name="axChange",		 		type="com.axon.components.events.AxListEvent")]  // name must be equal to AxonListEvent.SELECTION_CHANGE 
	[Event(name="axDefaultGesture", 	type="com.axon.components.events.AxListEvent")]  // name must be equal to AxonListEvent.DEFAULT_GESTURE

	public class AxTileList extends TileList
	{
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
   		[Inspectable(category="Other")] public var axHandleDefaultAction : Boolean = true;
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function AxTileList()
		{
			super();
			addEventListener( ListEvent.CHANGE, 		onChange );
			addEventListener( KeyboardEvent.KEY_DOWN, 	onKeyDown);
			addEventListener( MouseEvent.DOUBLE_CLICK, 	onDoubleClick);
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set dataProvider(value: Object): void
		{
			if (value == dataProvider)
				return;
			
			super.dataProvider = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set selectedItem(value: Object): void
		{
			if (value == selectedItem)
				return;
			
			super.selectedItem = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set selectedIndex(value: int): void
		{
			if (value == selectedIndex)
				return;
				
			super.selectedIndex = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private function onChange(event: Event): void
		{
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		protected function onKeyDown(event: KeyboardEvent): void
		{
			if ((event.charCode == Keyboard.SPACE) && selectedItem)
			{
				axPerformDefaultGesture();
			}   
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		protected function onDoubleClick(event: MouseEvent): void
		{
			axPerformDefaultGesture();
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axPerformDefaultGesture(): void
		{
			if ( selectedItem )
				dispatchEvent(new AxListEvent(AxListEvent.DEFAULT_GESTURE));
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axAddItem(value: Object, selectNewItem: Boolean = true): int
		{
			var xmlValue	: XML = AxUtils.objectToXML(value); 
			var result		: int = -1;
			var dtprov		: Object;
			
			if ( dataProvider is XMLListCollection ) 
			{
				XMLListCollection(dataProvider).addItem(xmlValue);
				result = axIdIndex(value.id); 
				
				if (selectNewItem)
					selectedIndex = result;

//				ArrayCollection(dataProvider).addItem(value);
//				selectedItem = value;
//				result = ArrayCollection(dataProvider).getItemIndex(value);
			}
			return result;
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axReplaceSelectedItem(newItem: Object): void
		{
			axReplaceItem(selectedItem, newItem);
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axReplaceItem(oldItem: Object, newItem: Object): void
		{
			var arrayCollection: ArrayCollection;
			var refreshSelection: Boolean;
			
			if (dataProvider is ArrayCollection) {
				
				arrayCollection  =  ArrayCollection(dataProvider);
				refreshSelection = (selectedItem == oldItem);   

	    		var i: int = arrayCollection.getItemIndex(oldItem);
    		
	    		if ( i != -1 ) {
    			
	    			arrayCollection.removeItemAt( i );
    				arrayCollection.addItemAt(newItem, i);

					if ( refreshSelection )
						selectedItem = newItem;
						
					invalidateList();
    			}
			}
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axRemoveItemAt(ind: int): void
		{
			if ( dataProvider is XMLListCollection )
			{
				var lenght	: int = XMLListCollection(dataProvider).length;

				if (ind == selectedIndex)
				{
					if (selectedIndex < lenght - 1) {
						selectedIndex += 1;
					} else if (selectedIndex > 0) {
						selectedIndex -= 1;
					} else {
						selectedIndex = -1;
					} 
				}
				
				XMLListCollection(dataProvider).removeItemAt(ind);
			}
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axRemoveAll(): void
		{
			if ( dataProvider is XMLListCollection )
				XMLListCollection(dataProvider).removeAll();
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axIdIndex(id: int): int
		{
			var result	: int = -1;
			var xc		: XMLListCollection;		
						
			if ( dataProvider is XMLListCollection ) {
			
				xc = (dataProvider as XMLListCollection);

				for (var i: int = 0; i < xc.length; i++) {
					
					if ( xc.getItemAt(i).id.toString() == id ) {
						result = i;
						break;
					}
				}
			}
			
			return result;
		}
		
	}
}